#include <iostream>

using namespace std;

int main()
{
    int ia[3][4] = {
        {0, 1, 2, 3},
        {4, 5, 6, 7},
        {8, 9, 10, 11}
    };
    int (*p)[4] = ia;       // p 指向含有 4 个整数的数组
    p = &ia[2];             // p 指向 ia 的尾元素

    // 输出 ia 中每个元素的值，每个内层数组各占一行
    // p 指向含有 4 个整数的数组
    for (auto p = ia; p != ia + 3; ++p) {
        // q 指向 4 个整数数组的首元素，也就是说，q 指向一个整数
        for (auto q = *p; q != *p + 4; ++q)
            cout << *q << ' ';
        cout << endl;
    }

    // 更简洁的写法：
    for (auto p = begin(ia); p != end(ia); ++p) {
        for (auto q = begin(*p); q != end(*p); ++q)
            cout << *q << ' ';
        cout << endl;
    }

    // 使用类型别名简化多维数组的指针
    using int_array = int[4];
    // typedef int int_array[4]; // 等价的 typedef 声明
    for (int_array *p = ia; p != ia + 3; ++p) {
        for (int *q = *p; q != *p + 4; ++q)
            cout << *q << ' ';
        cout << endl;
    }
}